from numpy import * import numpy as np import matplotlib.pyplot as plt import os #import scipy as sp from utils import DATA_DIR from tkinter import *
# y = mx + b # m is slope, b is y-intercept
##Creating the interface root=Tk() root.wm_title("Linear Regression") root.geometry("450x450+500+300")
###LoadData
data = np.loadtxt(os.path.join(DATA_DIR, "data.csv"),delimiter=",")
x = data[:, 0] y = data[:, 1]
### Defining error function f(x) def compute_error_for_line_given_points(b, m, points): fx = 0 for i in range(0, len(points)): x = points[i, 0] y = points[i, 1] fx += (y - (m * x + b)) ** 2 #TSSE return fx / float(len(points))
### Initialising the search for the best line fit(starting with any two values for m&b) ###allows the gradient descent algorithm to tries to reduce the error function f(x) ###to find the best fit line
def step_gradient(b_current, m_current, points, learningRate): b_intercept = 0 m_gradient = 0 N = float(len(points)) for i in range(0, len(points)): x = points[i, 0] y = points[i, 1] b_intercept += -(2/N) * (y - ((m_current * x) + b_current)) m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current)) new_b = b_current - (learningRate * b_intercept) new_m = m_current - (learningRate * m_gradient)
return [new_b, new_m]
def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations): b = starting_b m = starting_m plt.ion() for i in range(num_iterations): b, m = step_gradient(b, m, array(points), learning_rate) # plt.set_title('Linear Regression',color='black') #plt.set_xlabel('This is the X axis',color='white') #plt.set_ylabel('This is the Y axis',color='white') #plt.clf() plt.plot(x,m*x+b,'-') plt.scatter(x, y, label='Points', color='k', s=20, marker='*') plt.pause(0.2) plt.draw() # plt.show() print("New values for b and m: ") return [b, m]
def run(): points = data learning_rate = 0.00001 initial_b = 35 #initial y-intercept guess initial_m = 0 # initial slope guess num_iterations = 50 print ("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, initial_m, compute_error_for_line_given_points(initial_b, initial_m, points))) print ("Running...") [b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations) print("After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m, compute_error_for_line_given_points(b, m, points)))